package com.lizi.core.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;

import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
 * JSON 工具类
 * 改为采用fastjson包
 */
public class JsonUtil{

    public static String getJsonValue(String rescontent, String key) {
        JSONObject jsonObject;
        String v = null;
        try {
            jsonObject = JSONObject.parseObject(rescontent);
            v = jsonObject.getString(key);
        } catch (Exception e1) {
            e1.printStackTrace();
        }
        return v;
    }

    /**
     * 将自定义Domain类转换为JSON字符串
     *
     * //采用fastJson后，以下BUG待验证
     * 不支持 Domain 类中包含 List<CustomClass> 的实例域
     * Domain 类中不允许覆写 equals() 方法
     *
     * @param t
     * @return
     *
     */
    public static <T> String toJson(T t) {
        return JSON.toJSONString(t);
    }

    /**
     * 将JSON字符串转为自定义Domain类
     *
     * @return
     */
    public static <T> T toDomain(String jsonStr,Class<T> clazz) throws Exception{
        return JSON.parseObject(jsonStr,clazz);
    }


    /**
     * 将JSON字符串转为java对象
     *
     * @return
     */
    public static <T> T toClass(String jsonStr,JsonTypeRef<T> type) throws Exception{
        return JSON.parseObject(jsonStr, type);
    }

     public static class TypeRef<T> extends TypeReference<T>{
    }


    /**
     * 将JSON字符串转为Map
     *
     * @param jsonStr
     * @return
     * @throws Exception
     */
    public static Map toMap(String jsonStr) throws Exception{
        return (Map) JSON.parse(jsonStr);
    }


    /**
     * 将自定义 领域类List 转换为 JsonList
     *
     * @param list
     * @return
     */
    public static <T> List<String> toJsonList(List<T> list) throws Exception{
        List<String> newList = new LinkedList<String>();
        for (T t : list){
            newList.add(toJson(t));
        }
        return newList;
    }

    /**
     * 将JsonList 转换为 领域类List
     *
     * @param list
     * @param c
     * @return
     */
    public static <T> List<T> toDomainList(List<String> list,Class<T> c) throws Exception{
        List<T> newList = new LinkedList<T>();
        for(String str : list){
            newList.add(toDomain(str,c));
        }
        return newList;
    }

}
